/**
 * API服务模块
 * 处理Upbit API相关功能
 */

const axios = require('axios');
const https = require('https');
const { exec } = require('child_process');
const util = require('util');
const logger = require('../utils/logger');

const execPromise = util.promisify(exec);

class ApiService {
  constructor() {
    this.init();
  }

  /**
   * 初始化API服务
   */
  init() {
    // 配置 axios 默认设置，解决网络连接问题
    axios.defaults.httpsAgent = new https.Agent({
      rejectUnauthorized: false, // 在某些网络环境下可能需要
      keepAlive: true,
      timeout: 30000
    });

    // 设置默认超时
    axios.defaults.timeout = 30000;
  }

  /**
   * 使用 axios 直接请求获取交易对
   * @returns {Promise<Array>} 交易对列表
   */
  async fetchTradingPairsWithAxios() {
    try {
      logger.info('尝试使用 axios 直接请求...');
      
      const response = await axios.get('https://api.upbit.com/v1/market/all?isDetails=false', {
        timeout: 15000,
        headers: {
          'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
          'Accept': 'application/json',
          'Accept-Language': 'en-US,en;q=0.9',
          'Cache-Control': 'no-cache'
        }
      });
      
      const allPairs = response.data.map(market => market.market);
      // 只保留包含USDT的交易对
      const usdtPairs = allPairs.filter(pair => pair.includes('USDT'));
      logger.success(`axios 成功获取 ${allPairs.length} 个交易对，过滤后保留 ${usdtPairs.length} 个USDT交易对`);
      return usdtPairs;
    } catch (error) {
      logger.error(`axios 请求失败: ${error.message}`);
      throw error;
    }
  }

  /**
   * 使用 curl 模拟浏览器请求获取交易对
   * @returns {Promise<Array>} 交易对列表
   */
  async fetchTradingPairsWithCurl() {
    try {
      logger.info('使用 curl 模拟浏览器请求获取数据...');
      
      const curlCommand = `curl -s --connect-timeout 30 --max-time 30 \\
        -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" \\
        -H "Accept: application/json" \\
        -H "Accept-Language: en-US,en;q=0.9" \\
        -H "Cache-Control: no-cache" \\
        -H "Connection: keep-alive" \\
        "https://api.upbit.com/v1/market/all?isDetails=false"`;
      
      const { stdout, stderr } = await execPromise(curlCommand);
      
      if (stderr) {
        logger.warn(`curl 警告: ${stderr}`);
      }
      
      if (!stdout || stdout.trim() === '') {
        throw new Error('curl 返回空数据');
      }
      
      const data = JSON.parse(stdout);
      if (!Array.isArray(data)) {
        throw new Error('返回的数据格式不正确');
      }
      
      const allPairs = data.map(market => market.market);
      // 只保留包含USDT的交易对
      const usdtPairs = allPairs.filter(pair => pair.includes('USDT'));
      logger.success(`curl 成功获取 ${allPairs.length} 个交易对，过滤后保留 ${usdtPairs.length} 个USDT交易对`);
      return usdtPairs;
    } catch (error) {
      logger.error(`curl 获取失败: ${error.message}`);
      throw error;
    }
  }

  /**
   * 获取模拟的交易对数据（用于测试和备用）
   * @returns {Array} 模拟交易对列表
   */
  getMockTradingPairs() {
    logger.info('使用模拟数据进行测试...');
    
    // 基于真实数据的模拟，包含各种类型的交易对
    const allMockPairs = [
      "BTC-BERA", "BTC-FIL", "BTC-SIGN", "BTC-VIRTUAL", "BTC-BAT",
      "KRW-WAXP", "USDT-PEPE", "BTC-BAR", "USDT-WCT", "KRW-CARV",
      "KRW-LSK", "USDT-DOGE", "USDT-AXL", "BTC-SCR", "USDT-JASMY",
      "BTC-VANA", "BTC-LWA", "BTC-DGB", "USDT-BONK", "BTC-BCH"
    ];
    
    // 随机添加一个新的交易对来测试功能
    if (Math.random() < 0.1) { // 10% 概率添加新交易对
      const newPairs = ["KRW-NEW1", "BTC-NEW2", "USDT-NEW3"];
      const randomNew = newPairs[Math.floor(Math.random() * newPairs.length)];
      allMockPairs.push(randomNew);
      logger.info(`🎯 模拟添加新交易对: ${randomNew}`);
    }
    
    // 只保留包含USDT的交易对
    const usdtPairs = allMockPairs.filter(pair => pair.includes('USDT'));
    logger.info(`模拟数据过滤：共 ${allMockPairs.length} 个交易对，保留 ${usdtPairs.length} 个USDT交易对`);
    
    return usdtPairs;
  }

  /**
   * 获取所有交易对（多种方法尝试）
   * @returns {Promise<Array>} 交易对列表
   */
  async fetchTradingPairs() {
    try {
      logger.info('正在获取Upbit交易对数据...');
      
      // 方法1: 优先使用 axios（速度更快）
      try {
        return await this.fetchTradingPairsWithAxios();
      } catch (axiosError) {
        logger.warn('axios 方式失败，尝试使用 curl 方式...');
      }
      
      // 方法2: 使用 curl 模拟浏览器请求
      try {
        return await this.fetchTradingPairsWithCurl();
      } catch (curlError) {
        logger.warn('curl 方式也失败了');
        throw curlError;
      }
      
    } catch (error) {
      this.logApiError(error);
      return [];
    }
  }

  /**
   * 记录API错误信息
   */
  logApiError(error) {
    if (error.message.includes('timeout')) {
      logger.warn('请求超时，将在下次检查时重试');
    } else if (error.message.includes('ENOTFOUND')) {
      logger.warn('DNS解析失败，请检查网络连接');
    } else if (error.message.includes('ECONNREFUSED')) {
      logger.warn('连接被拒绝，可能需要配置代理');
    } else if (error.response) {
      logger.warn(`API请求失败: ${error.response.status} - ${error.response.statusText}`);
    } else {
      logger.warn(`网络错误: ${error.message}`);
    }
  }
}

module.exports = ApiService;
